package calculatorTools;

public class TimeTester {
	
	private static int hoursAvanceForCorrection = 8;
	
	/**
	 * Calcule le retard entre le temps de référence et le temps comparé (format attendu "hh:mm")
	 * @param referenceTime Le temps de référence
	 * @param comparedTime Le temps pour lequel le calcul d'avance ou de retard par rapport au temps de référence sera fait
	 * @return nombre de minutes de retard 
	 * (positif si comparedTime > referenceTime, 0 si comparedTime <= referenceTime, -1 si erreur dans les formats d'heure)
	 */
	public static int compareTimes(String referenceTime, String comparedTime) {
		
		int returnValue = -1;
		
		if (referenceTime.matches("^[\\d]{1,2}:[0-5]\\d$") &&
				comparedTime.matches("^[\\d]{1,2}:[0-5]\\d$")) {
			
			String[] detailRefTimeStr = referenceTime.split(":");
			int refHour = Integer.parseInt(detailRefTimeStr[0]);
			int refMin = Integer.parseInt(detailRefTimeStr[1]);
			
			String[] detailCompTimeStr = comparedTime.split(":");
			int compHour = Integer.parseInt(detailCompTimeStr[0]);
			int compMin = Integer.parseInt(detailCompTimeStr[1]);
			
			
			// ------------------------ DEBUT COMPARAISON ------------------------
			
			int minutesOfDifference = 0;

			if (compHour >= refHour) {
				// Pas d'avance, donc pas de cas particulier
				
				minutesOfDifference = (compHour - refHour) * 60;
				
				if (compMin >= refMin) {
					minutesOfDifference += (compMin - refMin);
				}
				else {
					minutesOfDifference -= 60;
					minutesOfDifference += compMin + (60 - refMin);
				}
			}
			else {
				
				if (refHour - compHour >= hoursAvanceForCorrection) {
					// Avance tellement importante pour penser qu'il s'agit
					// d'un retard avec changement de date (23h -> 00h)
					
					// On refait la comparaison avec 24h de plus pour compenser le changement de date
					compHour += 24;
					
					minutesOfDifference = (compHour - refHour) * 60;
					if (compMin >= refMin) {
						minutesOfDifference += (compMin - refMin);
					}
					else {
						minutesOfDifference -= 60;
						minutesOfDifference = compMin + (60 - refMin);
					}
				}
			}
			
			
			returnValue = minutesOfDifference < 0 ? 0 : minutesOfDifference;
		}
		
		return returnValue;
	}
}
